import { isSameSign } from "../../primitve/number";

type SingleParamPureFunc = (x: number) => number;

export function resolveFunc(func: SingleParamPureFunc, epsilon = 1e-2) {
  return function (low: number, high: number, target: number) {
    let x: number,
      iterativeCount = 0;
    do {
      x = high - (high - low) / 2;
      iterativeCount++;
      const section1 = func(low) - target;
      const section2 = func(x) - target;
      isSameSign(section1, section2) ? (low = x) : (high = x);
    } while (Math.abs(high - low) > epsilon);
    x = high - (high - low) / 2;
    return { x, iterativeCount };
  };
}

/**
 * #### 安全地解析JSON字符串;封装JSON.parse，防止解析过程中抛出异常
 * @author 討厭吃香菜
 * @date 2025-04-20 17:32:39
 * @see https://juejin.cn/post/7441579217542922266
 * @param text 输入的JSON字符串
 * @param reviver 可选的回调函数，用于在解析过程中对值进行转换
 * @returns
 */
export function safeJsonParse(
  // 输入的JSON字符串
  text: string,
  // 可选的回调函数，用于在解析过程中对值进行转换
  reviver?: (this: any, key: string, value: any) => any
): { value: unknown; error: null | Error; isValid: () => boolean } {
  // 声明一个变量，用于存储解析后的值
  let value: unknown,
    // 声明一个变量，用于存储解析过程中发生的错误
    error: null | Error = null;
  // 声明一个函数，用于判断解析是否成功
  const isValid = () => error === null;

  try {
    // 如果输入的值不是字符串或者为null，则抛出错误
    if (typeof text !== "string" || text === "null") {
      throw new Error("Invalid JSON value");
    }
    // 使用JSON.parse方法解析字符串，并传入回调函数
    value = JSON.parse(text, reviver);
  } catch (e: any) {
    // 如果解析过程中发生错误，则将错误赋值给error变量
    error = e;
  }

  // 返回一个对象，包含解析后的值、错误信息和判断解析是否成功的函数
  return { value, error, isValid };
}

// 导出一个函数，用于判断两个值是否相等
export function hasChanged(x: unknown, y: unknown) {
  // 如果两个值相等
  if (x === y) {
    return x === 0 && 1 / x !== 1 / (y as number); // 排除 -0 和 +0
  } else {
    return x === x || y === y; // 排除 NaN
  }
}

// export function isPromise(val: unknown): val is Promise<unknown> {
//   return (
//     !!val &&
//     (val instanceof Promise ||
//       (typeof val === "object" &&
//         typeof val.then === "function" &&
//         typeof val.catch === "function"))
//   );
// }
